package com.testing.webPO;

import com.testing.web.WebKeyword;
import io.qameta.allure.Attachment;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

import java.lang.reflect.Field;

/**
 * @Classname AllureListener
 * @Description 用于完成错误截图的allure监听器类，通过继承TestNG监听器
 * 重写onTestFailure方法设置测试执行失败时的策略为进行截图，
 * 并附加为Allure报告中的附件。
 * @Date 2021/7/8 22:34
 * @Created by 特斯汀Roy
 */
public class AllureListener extends TestListenerAdapter {

    @Override
    public void onTestFailure(ITestResult tr) {
//        父类原本的操作依然需要执行。
        super.onTestFailure(tr);
        //ITestResult 接口类，可以获取执行的测试类的对象，并从中解析对应的内容。
        //从结果中，获取执行的测试类的实例对象
        Object testinstance = tr.getInstance();
        //输出一下这个对象的类型。(反射机制)
        System.out.println(testinstance.getClass().getName());
        //基于反射机制，获取对象中一个名叫web的变量。
        try {
            //基于反射机制获取一个Field域 （变量）类型 的对象，
            Field web = testinstance.getClass().getField("web");
            //真正需要获取的是TestNGDDTofWeb类型的对象
            WebKeyword  webKeyword = (WebKeyword) web.get(testinstance);
            //传递对象中的driver，也就是用同一个浏览器来完成截图操作。
            saveScreenshot(webKeyword.getDriver());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Attachment(value = "失败时的截图是：", type = "image/png")
    public byte[] saveScreenshot(WebDriver driver){
       return  ((TakesScreenshot)driver).getScreenshotAs(OutputType.BYTES);

    }





}
